﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using APILocawebGatewayUI.Nucleo;

namespace APILocawebGatewayUI.VISA
{
    /// <summary>
    /// Classe que contém um conjunto de métodos para ajudar a utilização da forma VISAVBV
    /// </summary>
    public class VisaUtilidades
    {
        /// <summary>
        /// Retorna o tamanho de uma imagem
        /// </summary>
        /// <param name="imgPath"></param>
        /// <returns></returns>
        internal static String VisaVerificaImagem(string imgPath)
        {
            try
            {
                return (imgPath == string.Empty || imgPath.Contains("/WebResource.axd?")
                            ? "98"
                            : Image.FromFile(HttpContext.Current.Request.PhysicalApplicationPath + imgPath.Replace("/", "\\")).Width
                                  .ToString());
            }
            catch
            {
                return "98";
            }
        }

        /// <summary>
        /// Sua geração é baseada no número de afiliação da loja formatado, o último dígito do ano corrente, a data atual em formato Juliano (Calendário Juliano), hora + minutos + segundos formatado e seu código de pagamento (tipo de pagamento: 10 – à vista, 20 – com juros do lojista, 30 – com juros do emissor e A0 – cartão de débito + número de parcelas da compra).
        /// </summary>
        /// <param name="afiliacao"></param>
        /// <param name="parcelas"></param>
        /// <param name="tipoDeParcelamento"></param>
        /// <returns></returns>
        internal static String GerarTid(string afiliacao, string parcelas, TipoDeParcelamento tipoDeParcelamento)
        {
            for (int i = parcelas.Length; i < 3; i++)
                parcelas = "0" + parcelas;

            return FormataAfiliacaoVisa(afiliacao) + RecuperaUltimoDigitoDoAno(DateTime.Now) + RecuperaDataJuliana(DateTime.Now) + RecuperaHorarioFormatoVisa(DateTime.Now) + (int)tipoDeParcelamento + parcelas;
        }


        #region Tid Complementos
        internal static String RecuperaDataJuliana(DateTime date)
        {
            DateTime sinceDate = new DateTime(DateTime.Now.Year, 1, 1);
            String julianDateAsString = (date.Date.AddDays(1) - sinceDate).Days.ToString();
            for (int i = julianDateAsString.Length; i < 3; i++)
                julianDateAsString = "0" + julianDateAsString; ;

            return julianDateAsString;

        }

        internal static String RecuperaHorarioFormatoVisa(DateTime dateTime)
        {
            String hour = dateTime.Hour.ToString();
            String minutes = dateTime.Minute.ToString();
            String seconds = dateTime.Second.ToString();
            if (hour.Length == 1)
                hour = "0" + hour;

            if (minutes.Length == 1)
                minutes = "0" + minutes;

            if (seconds.Length == 1)
                seconds = "0" + seconds;


            return (hour + minutes + seconds + (dateTime.Millisecond / 100));
        }

        internal static String FormataAfiliacaoVisa(String afiliacao)
        {
            return afiliacao.Substring(4, 5);
        }

        internal static String RecuperaUltimoDigitoDoAno(DateTime date)
        {
            return date.Year.ToString().Substring(3);
        }

        internal static DateTime DaysSinceThisYear(int days)
        {
            return new DateTime(DateTime.Now.Year, 1, 1).AddDays(days);
        }

        #endregion

        #region Funções para analisar retorno LR

        internal class RetornoLr
        {
            public List<int> Chaves { get; private set; }

            public string Mensagem { get; private set; }

            public RetornoLr(IEnumerable<int> chaves, string mensagem)
            {
                this.Chaves = new List<int>(chaves);
                this.Mensagem = mensagem;


            }
        }

        /// <summary>
        /// Este método extrai o valor de uma determinada tag XML em uma String
        /// </summary>
        /// <param name="resultado"></param>
        /// <param name="nomeTag">O nome da tag, sem os sinais de maior e menor
        /// Exemplo: caso a tag seja <free>deve ser passado apenas free</free>
        /// <returns></returns>
        internal static String ObterValorRetorno(String resultado, String nomeTag)
        {
            return Utilidades.ExtrairString(resultado, "<" + nomeTag + ">", "</" + nomeTag + ">");
        }

        internal static bool VerificaSucesso(Int32 codigo)
        {
            return (codigo == 0 || codigo == 11);
        }

        internal static List<RetornoLr> lista;

        internal static List<RetornoLr> ListaRetornoLr()
        {
            lista = new List<RetornoLr>();
            List<Int32> listaTemporaria;

            listaTemporaria = new List<int> { 0, 11 };
            lista.Add(new RetornoLr(listaTemporaria, "Seu processo de pagamento foi finalizado com sucesso!"));

            listaTemporaria = new List<int>
                                  {
                                      1,
                                      2,
                                      15,
                                      19,
                                      21,
                                      28,
                                      41,
                                      43,
                                      51,
                                      54,
                                      55,
                                      57,
                                      61,
                                      62,
                                      63,
                                      65,
                                      75,
                                      82,
                                      89,
                                      91,
                                      93,
                                      94,
                                      96,
                                      98,
                                      100,
                                      110,
                                      120,
                                      130,
                                      140,
                                      150,
                                      160,
                                      180,
                                      299
                                  };
            lista.Add(new RetornoLr(listaTemporaria, "Ocorreu um erro no processo de pagamento. Por favor, tente novamente mais tarde."));

            listaTemporaria = new List<int>
                                  {
                                      3,
                                      22,
                                      76,
                                      77,
                                      81,
                                      83,
                                      85,
                                      99,
                                      170,
                                      194,
                                      195,
                                      196,
                                      197,
                                      198,
                                      199,
                                      200,
                                      201,
                                      202,
                                      203,
                                      207,
                                      208,
                                      209,
                                      210,
                                      211,
                                      212,
                                      213,
                                      214,
                                      215,
                                      216,
                                      221,
                                      228,
                                      229,
                                      230,
                                      232
                                  };
            lista.Add(new RetornoLr(listaTemporaria, "Ocorreu um erro no processo de pagamento.Por favor, entre em contato com o organizador do evento e informe o código LR abaixo"));

            listaTemporaria = new List<int> { 25 };
            lista.Add(new RetornoLr(listaTemporaria, "Número do cartão inválido. Por favor, informe corretamente o número de seu cartão."));

            listaTemporaria = new List<int> { 52, 230 };
            lista.Add(new RetornoLr(listaTemporaria, "Código de verificação inválido. Por favor, informe corretamente o código de verificação de seu cartão."));

            listaTemporaria = new List<int> { 53 };
            lista.Add(new RetornoLr(listaTemporaria, "Cartão inválido para essa operação. Verifique se a bandeira de seu cartão é Visa."));

            listaTemporaria = new List<int> { 80 };
            lista.Add(new RetornoLr(listaTemporaria, "Data de validade incorreta. Por favor, informe corretamente a data de validade de seu cartão"));

            listaTemporaria = new List<int> { 100, 110, 120, 130, 140, 150, 160 };
            lista.Add(new RetornoLr(listaTemporaria, "Falha de comunicação entre Visanet e banco durante o processo de autenticação. Por favor, tente novamente mais tarde"));
            return lista;
        }

        internal static String PegaMensagemTransacao(int codigo)
        {
            RetornoLr retornoLR = ListaRetornoLr().Where(x => x.Chaves.Exists(y => y == codigo)).FirstOrDefault();
            return retornoLR != null ? retornoLR.Mensagem : string.Empty;
        }

        #endregion

        #region Formatação

        /// <summary>
        /// Função que formata um valor para o campo formatado VISAVBV
        /// </summary>
        /// <param name="price"></param>
        /// <returns></returns>
        public static string FormatarValorCampoFormatado(Decimal price)
        {
            String priceAsString = price.ToString("C");
            return (priceAsString);
        }

        public static String FormatarValor(Decimal value)
        {
            return Nucleo.Utilidades.FormatarValorMoedaParaFormulario(value);

        }
        #endregion


    }
}